/*
 * Copyright © 2020-2021 尛飛俠（Denvie） All rights reserved.
 */

package cn.denvie.springboot.freemarker.custom;

import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 自定义权限校验指令。
 *
 * @author Denvie
 * @date 2021/5/25
 * @since 1.0.0
 */
@Service
public class RoleDirectiveModel implements TemplateDirectiveModel {
    /**
     * 指令处理。
     *
     * @param env      环境变量
     * @param params   传递给自定义标签的参数。其中map的key是自定义标签的参数名，value值是TemplateModel实例
     * @param loopVars 指令的出参，数组格式
     * @param body     指令内容
     * @throws TemplateException
     * @throws IOException
     */
    @Override
    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
            throws TemplateException, IOException {
        // 取出user和role两个入参
        TemplateScalarModel user = (TemplateScalarModel) params.get("user");
        TemplateScalarModel role = (TemplateScalarModel) params.get("role");

        TemplateBooleanModel isAdmin;
        List<String> otherRights = new ArrayList<>();

        // 查看该用户的权限是否为admin，取出该用户其他权限
        if ("denvie".equals(user.getAsString()) && "admin".equals(role.getAsString())) {
            isAdmin = TemplateBooleanModel.TRUE;
            otherRights.add("get");
            otherRights.add("add");
            otherRights.add("update");
            otherRights.add("delete");
        } else {
            isAdmin = TemplateBooleanModel.FALSE;
            otherRights.add("get");
        }

        // 给出参1赋值
        loopVars[0] = isAdmin;
        // 给出参2赋值
        loopVars[1] = new SimpleSequence(otherRights, null);

        // 把结果输出到ftl页面中
        body.render(env.getOut());
    }
}
